//package practice.unionfind.general;
//
//import practice.tree.four.HashMap;
//import practice.tree.four.Map;
//
//import java.util.Objects;
//
///**
// * @Description:
// * @Author Ammar
// * @Create 2023/8/26 20:46
// */
//public class UnionFind<V> {
//    Map<V, Node<V>> map = new HashMap<>();
//
//    public void makeSet(V value) {
//        if (map.containsKey(value)) return;
//        map.put(value, new Node<>(value));
//    }
//
//    public V find(V v) {
//        Node<V> node = findNode(v);
//        return node == null ? null : node.value;
//    }
//
//    public Node<V> findNode(V v) {
//        Node<V> node = map.get(v);
//        if (node == null) return null;
//        while (node != node.parent) {
//            node.parent = node.parent.parent;
//            node = node.parent;
//        }
//        return node;
//    }
//
//    public void union(V v1, V v2) {
//        Node<V> p1 = findNode(v1);
//        if (p1 == null) return;
//        Node<V> p2 = findNode(v2);
//        if (p2 == null) return;
//        if (Objects.equals(p1, p2)) return;
//
//        if (p1.rank > p2.rank) {
//            p2.parent = p1;
//        } else if (p1.rank < p2.rank) {
//            p1.parent = p2;
//        } else {
//            p2.parent = p1;
//            p1.rank = p1.rank + 1;
//        }
//    }
//
//    public boolean isSame(V v1, V v2) {
//        return Objects.equals(find(v1), find(v2));
//    }
//
//
//    private static class Node<V> {
//        V value;
//        int rank = 1;
//        Node<V> parent = this;
//        public Node(V value) {
//            this.value = value;
//        }
//    }
//}
